package com.morgan.test;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * BlockingQueue 接口表示它是一个 Queue，意思是它的项以先入先出（FIFO）顺序存储。

在特定顺序插入的项以相同的顺序检索 — 但是需要附加保证，从空队列检索一个项的任何尝试都会阻塞调用线程，直到这个项准备好被检索。同理，想要将一个项插入到满队列的尝试也会导致阻塞调用线程，直到队列的存储空间可用。
BlockingQueue 干净利落地解决了如何将一个线程收集的项“传递”给另一线程用于处理的问题，无需考虑同步问题。
Java Tutorial 的 Guarded Blocks 试用版就是一个很好的例子。
它构建一个单插槽绑定的缓存，当新的项可用，而且插槽也准备好接受新的项时，
使用手动同步和 wait()/notifyAll() 在线程之间发信。
 * @author morgan.liao
 *
 */

public class CTBlockingQueue {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        BlockingQueue<String> drop = new ArrayBlockingQueue(5, true);
        (new Thread(new Producer(drop))).start();
        (new Thread(new Consumer(drop))).start();
    }

}
